Data prep

Score distributions

First, let’s look at the distributions of scores for all scales, pre- and post-test:

It looks like there’s a lot of overlap in the pre- and post-test distrubtions for all scales - though a few hints of subtle shifts (e.g., in diseaseRare, vaccIntent).

Visual comparison of pre- vs. post-intervention

Let’s compare participants’ responses pre- vs. post-intervention on all scales. I’ll plot both mean pre- and post-intervention scores, as well as mean difference scores (note separate axes):

Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.
Scale for 'colour' is already present. Adding another scale for 'colour',
which will replace the existing scale.

Some interesting things might be going on here! Probably most useful paired with some actual stats…

Regression analyses

First, let’s choose how to code our data - I’ve set up contrast coding, effect coding and dummy coding options here, and I’ll go with dummy-coding for now (with noInterv and pre as the baselines for comparison for condition and phase, respectively).

            DR_none
noInterv          0
diseaseRisk       1
     post_pre
pre         0
post        1

By scale

This is rather crazy (and of course exploratory) endeavor, and very vulnerable to multiple comparisons… but let’s look at the effects on all scales individually.

Beliefs about vaccines

Intentions to vaccinate (vaccIntent)

NOTE: This is our main DV of interest.

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "vaccIntent")

REML criterion at convergence: 2556

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.85092 -0.39910  0.07441  0.35054  2.56529 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.3847   1.1768  
 Residual             0.2012   0.4485  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     1.56052    0.08250  18.915
phasepost_pre                  -0.02918    0.04155  -0.702
conditionDR_none               -0.02975    0.11360  -0.262
phasepost_pre:conditionDR_none  0.15303    0.05722   2.674

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.252              
condtnDR_nn -0.726  0.183       
phspst_:DR_  0.183 -0.726 -0.252

Success! In the form of a significant interaction between phase and condition (phasepost_pre:conditionDR_none: change from pre- to post-intervention in the Disease Risk vs. No Intervention conditions).

An analysis with change scores (a la Horne, Powell, et al. (2015, PNAS)):


Call:
lm(formula = diff ~ condition, data = d_scored %>% filter(scale == 
    "vaccIntent") %>% spread(phase, mean) %>% mutate(diff = post - 
    pre))

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3239 -0.3239 -0.1239  0.2292  2.4292 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)   
(Intercept)      -0.02918    0.04155  -0.702  0.48280   
conditionDR_none  0.15303    0.05722   2.674  0.00773 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6343 on 491 degrees of freedom
Multiple R-squared:  0.01436,   Adjusted R-squared:  0.01235 
F-statistic: 7.153 on 1 and 491 DF,  p-value: 0.007734

Again, success!

Here’s the relevant plot from the PNAS paper:

Vaccine danger (vaccDanger)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "vaccDanger")

REML criterion at convergence: 2093.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2083 -0.4591  0.0028  0.4205  3.4583 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.0471   1.0233  
 Residual             0.1059   0.3254  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                    -1.03519    0.07035 -14.716
phasepost_pre                  -0.01631    0.03015  -0.541
conditionDR_none                0.07442    0.09687   0.768
phasepost_pre:conditionDR_none -0.15292    0.04151  -3.684

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.214              
condtnDR_nn -0.726  0.156       
phspst_:DR_  0.156 -0.726 -0.214

Vaccine efficacy (vaccEff)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "vaccEff")

REML criterion at convergence: 2116.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8279 -0.4203  0.0566  0.4337  3.0855 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 0.7794   0.8828  
 Residual             0.1435   0.3788  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     0.42060    0.06293   6.683
phasepost_pre                   0.05408    0.03509   1.541
conditionDR_none               -0.04291    0.08666  -0.495
phasepost_pre:conditionDR_none  0.12746    0.04832   2.638

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.279              
condtnDR_nn -0.726  0.202       
phspst_:DR_  0.202 -0.726 -0.279

Vaccines’ tendency to strain the infant immune system (vaccStrain)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "vaccStrain")

REML criterion at convergence: 2682

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.8991 -0.4107 -0.0029  0.4120  3.4686 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.2621   1.1234  
 Residual             0.2759   0.5252  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                    -0.57167    0.08124  -7.036
phasepost_pre                   0.07811    0.04866   1.605
conditionDR_none                0.05090    0.11187   0.455
phasepost_pre:conditionDR_none -0.17657    0.06701  -2.635

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.299              
condtnDR_nn -0.726  0.217       
phspst_:DR_  0.217 -0.726 -0.299

Vaccine toxicity (vaccTox)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "vaccTox")

REML criterion at convergence: 2386.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.91670 -0.40646 -0.03804  0.40448  2.94732 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.250    1.1180  
 Residual             0.159    0.3988  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                    -0.228326   0.077765  -2.936
phasepost_pre                  -0.048927   0.036948  -1.324
conditionDR_none                0.014480   0.107083   0.135
phasepost_pre:conditionDR_none -0.008765   0.050878  -0.172

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.238              
condtnDR_nn -0.726  0.173       
phspst_:DR_  0.173 -0.726 -0.238

Beliefs about diseases

Disease severity (diseaseSevere)

NOTE: This is the scale that we thought the Disease Risk intervention should affect most directly.

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "diseaseSevere")

REML criterion at convergence: 2398.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7530 -0.3823  0.0517  0.4004  2.6982 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 0.7094   0.8423  
 Residual             0.2585   0.5084  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     1.84721    0.06445  28.659
phasepost_pre                  -0.00515    0.04711  -0.109
conditionDR_none               -0.06721    0.08875  -0.757
phasepost_pre:conditionDR_none  0.32515    0.06486   5.013

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.365              
condtnDR_nn -0.726  0.265       
phspst_:DR_  0.265 -0.726 -0.365

Disease rarity (diseaseRare)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "diseaseRare")

REML criterion at convergence: 2603.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.9595 -0.4748 -0.0016  0.4434  3.6064 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 0.7478   0.8648  
 Residual             0.3558   0.5965  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                    -0.96223    0.06882 -13.981
phasepost_pre                  -0.08326    0.05527  -1.507
conditionDR_none               -0.18238    0.09477  -1.924
phasepost_pre:conditionDR_none -0.17828    0.07610  -2.343

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.402              
condtnDR_nn -0.726  0.292       
phspst_:DR_  0.292 -0.726 -0.402

Beliefs about infants’ immune systems

Limited capacity of infants’ immune systems (infantImmLimCap)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "infantImmLimCap")

REML criterion at convergence: 2759.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.5529 -0.3988 -0.0115  0.4562  3.7260 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 0.9137   0.9559  
 Residual             0.4054   0.6367  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     0.41373    0.07524   5.499
phasepost_pre                  -0.03433    0.05899  -0.582
conditionDR_none                0.07857    0.10361   0.758
phasepost_pre:conditionDR_none  0.11433    0.08123   1.408

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.392              
condtnDR_nn -0.726  0.285       
phspst_:DR_  0.285 -0.726 -0.392

Weakness of infants’ immune systems (infantImmWeak)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "infantImmWeak")

REML criterion at convergence: 2785.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.56604 -0.47750 -0.00131  0.45358  2.41157 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.0021   1.001   
 Residual             0.3969   0.630   
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     0.29013    0.07749   3.744
phasepost_pre                  -0.04549    0.05837  -0.779
conditionDR_none                0.10449    0.10670   0.979
phasepost_pre:conditionDR_none  0.04242    0.08037   0.528

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.377              
condtnDR_nn -0.726  0.274       
phspst_:DR_  0.274 -0.726 -0.377

Other beliefs, attitudes, and worldviews

Medical skepticism (medSkept)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "medSkept")

REML criterion at convergence: 2453.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-3.10928 -0.43517 -0.02145  0.42521  3.09386 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.1431   1.0692  
 Residual             0.1953   0.4419  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     0.05007    0.07579   0.661
phasepost_pre                  -0.04220    0.04094  -1.031
conditionDR_none                0.05634    0.10436   0.540
phasepost_pre:conditionDR_none -0.11677    0.05638  -2.071

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.270              
condtnDR_nn -0.726  0.196       
phspst_:DR_  0.196 -0.726 -0.270

Holistic balance (hb)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "hb")

REML criterion at convergence: 2407.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.53977 -0.42672  0.03449  0.46098  2.53965 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.0026   1.0013  
 Residual             0.2001   0.4473  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     0.22232    0.07185   3.094
phasepost_pre                  -0.01545    0.04144  -0.373
conditionDR_none                0.00999    0.09893   0.101
phasepost_pre:conditionDR_none -0.11840    0.05707  -2.075

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.288              
condtnDR_nn -0.726  0.209       
phspst_:DR_  0.209 -0.726 -0.288

Naturalism (nat)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "nat")

REML criterion at convergence: 2450.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0499 -0.4451  0.0037  0.4351  3.3838 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.0731   1.0359  
 Residual             0.2049   0.4526  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                    -0.34335    0.07406  -4.636
phasepost_pre                  -0.03004    0.04194  -0.716
conditionDR_none                0.02027    0.10198   0.199
phasepost_pre:conditionDR_none -0.05778    0.05775  -1.001

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.283              
condtnDR_nn -0.726  0.206       
phspst_:DR_  0.206 -0.726 -0.283

Overparenting (overpar)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "overpar")

REML criterion at convergence: 2593.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-3.15393 -0.47665 -0.06009  0.45377  2.49500 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 0.7761   0.8810  
 Residual             0.3408   0.5837  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                    -0.015451   0.069235  -0.223
phasepost_pre                  -0.019742   0.054083  -0.365
conditionDR_none               -0.001472   0.095338  -0.015
phasepost_pre:conditionDR_none  0.284358   0.074473   3.818

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.391              
condtnDR_nn -0.726  0.284       
phspst_:DR_  0.284 -0.726 -0.391

Parental Expertise (parentExpert)

Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
   Data: d_scored %>% filter(scale == "parentExpert")

REML criterion at convergence: 2446

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2300 -0.4653 -0.0184  0.4962  3.0384 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerId (Intercept) 1.2031   1.0969  
 Residual             0.1844   0.4294  
Number of obs: 986, groups:  workerId, 493

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                    -0.49356    0.07717  -6.396
phasepost_pre                   0.01459    0.03978   0.367
conditionDR_none                0.01741    0.10626   0.164
phasepost_pre:conditionDR_none -0.10613    0.05478  -1.937

Correlation of Fixed Effects:
            (Intr) phsps_ cndDR_
phasepst_pr -0.258              
condtnDR_nn -0.726  0.187       
phspst_:DR_  0.187 -0.726 -0.258

Other stuff

Violin plots

With violin plots, we can see the full distribution of scores at each time point in each condition:

Derek’s analyses

DATE: March 13, 2018 3:52 PM

I’m going to pick up here and do some further regression analyses. I’ll look at this data in the way I wish we’d looked at the original PNAS data.

That is, (1) using an ordinal HLM regression over the five separate scale items (conceptually, I think, similar to SEM-style approaches), and (2) using beta regression.

There are two general model forms that I think are reasonable for looking at this. First:

response ~ phase * condition

Kara already tried this general approach, saving the model as r1_vaccIntent. So the only difference here will be the distributions I use. In this case, the interaction term is required, and the real thing to test is the phase*condition interaction.

And second:

post_response ~ pre_response * condition

Here pre_response could be the response on the overall pre-test scale, or the individual items. In addition, the interaction terms are optional, as warranted by the data. I’d wager this is the more familiar approach for most psychologists.

Ordinal HLM

Predicting “response”

Predicting post-test

Here pre is the specific item pre-test score and preMean is the mean of the scale at pretest.

Regression on scale averages

Recall, Kara already looked at a normal regression on responses with r1_vaccIntent model.

Normal regression: predicting post-test

            diseaseRisk
noInterv              0
diseaseRisk           1

Beta regression: response

A beta regression on the responses accords with the linear regression on responses–slight positive effect of diseaseRisk, slight negative effect of autism correction, but too much uncertainty overall.

But, our response variable isn’t really all that appropriate for a linear regression, even if many researchers would be happy with that results and move on. Instead, vaccIntent is bounded and highly skewed. That makes it suitable for beta regression.

Error in as.vector(res) : object 'res' not found

Beta regresstion: posttest

Let’s look at predicting post-test with beta regression. Here there’s no evidence at all for any positive effect of diseaseRisk (in fact the coefficient is negative), but there is evidence of BACKFIRE for the autism correction condition.


Call:
betareg(formula = post ~ scale(pre) * condition, data = d2 %>% mutate(post = rescale_beta(post, 
    -3, 3)))

Standardized weighted residuals 2:
    Min      1Q  Median      3Q     Max 
-7.4139 -0.6774 -0.2381  0.6395  4.6225 

Coefficients (mean model with logit link):
                                Estimate Std. Error z value Pr(>|z|)    
(Intercept)                      1.38527    0.05396  25.674   <2e-16 ***
scale(pre)                       1.17727    0.05586  21.073   <2e-16 ***
conditiondiseaseRisk             0.15757    0.07167   2.198   0.0279 *  
scale(pre):conditiondiseaseRisk -0.06144    0.07196  -0.854   0.3932    

Phi coefficients (precision model with identity link):
      Estimate Std. Error z value Pr(>|z|)    
(phi)   8.6048     0.5632   15.28   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Type of estimator: ML (maximum likelihood)
Log-likelihood: 583.5 on 5 Df
Pseudo R-squared: 0.5531
Number of iterations: 12 (BFGS) + 3 (Fisher scoring) 

AIC favors the beta regression over the linear regression strongly.

[1] -864.451
[1] -1157.006

LS0tCnRpdGxlOiAnVmFjY2luZXM6IE1hbnkgQmVsaWVmcyBTdHVkeSAzOiBBbmFseXNpcycKYXV0aG9yOiAiRGVyZWsgUG93ZWxsLCBLYXJhIFdlaXNtYW4iCmRhdGU6ICIyMDE4LTA1LTAxIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZ9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQojIGxpYnJhcnkoZ2djb3JycGxvdCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGJybXMpCmxpYnJhcnkocm1zKQpgYGAKCiMgRGF0YSBwcmVwCgpgYGB7ciB0aWR5LCBpbmNsdWRlID0gRn0KIyBsb2FkIGRhdGEKZF9hbGwgPC0gcmVhZC5jc3YoIi4uL3N0dWR5My9kYXRhL3N0dWR5M19kYXRhLmNzdiIpWy0xXQoKIyByZWZvcm1hdCB0byBtYXRjaCBwcmV2aW91cyBhbmFseXNlcyAoaS5lLiwgMiByb3dzIHBlciBwYXJ0aWNpcGFudCkKZF9kZW1vIDwtIGRfYWxsICU+JSAKICBzZWxlY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgZ2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgZWR1Y2F0aW9uLCBqb2IsIGluY29tZSwKICAgICAgICAgcG9saXRpY2FsX3BhcnR5LCBwb2xpdGljYWxfYmVsaWVmcywgZWxpZ2libGVfcHJldGVzdCwgCiAgICAgICAgIGlzX3BhcmVudF9wb3N0dGVzdCwgY2hpbGRyZW5fbnVtX3Bvc3R0ZXN0LCBjaGlsZHJlbl9vbGRlc3RfcG9zdHRlc3QsIAogICAgICAgICBjaGlsZHJlbl95b3VuZ2VzdF9wb3N0dGVzdCwgcGxhbl9wYXJlbnRfcG9zdHRlc3QsCiAgICAgICAgIHN0YXJ0c193aXRoKCJmbHVzaG90XyIpLCBzdGFydHNfd2l0aCgidmF4XyIpLCBzdGFydHNfd2l0aCgiYXR0ZW50aW9uXyIpLAogICAgICAgICBzdGFydHNfd2l0aCgiY29tbWVudHMiKSwgc3RhcnRzX3dpdGgoImR1cmF0aW9uIikpCmRfcHJlIDwtIGRfYWxsICU+JSAKICBzZWxlY3Qod29ya2VySWQsIGVuZHNfd2l0aCgiX3ByZXRlc3QiKSkgJT4lCiAgc2VsZWN0KC1jKGVsaWdpYmxlX3ByZXRlc3QsIHN0YXJ0c193aXRoKCJmbHVzaG90XyIpLCBzdGFydHNfd2l0aCgidmF4XyIpLCAKICAgICAgICAgICAgc3RhcnRzX3dpdGgoImF0dGVudGlvbl8iKSwgc3RhcnRzX3dpdGgoImNvbW1lbnRzIiksIAogICAgICAgICAgICBzdGFydHNfd2l0aCgiZHVyYXRpb24iKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJfcHJldGVzdCIsICIiLCAuKSkpICU+JQogIG11dGF0ZShwaGFzZSA9ICJwcmUiKQpkX3Bvc3QgPC0gZF9hbGwgJT4lIAogIHNlbGVjdCh3b3JrZXJJZCwgZW5kc193aXRoKCJfcG9zdHRlc3QiKSkgJT4lCiAgc2VsZWN0KC1jKGlzX3BhcmVudF9wb3N0dGVzdCwgY2hpbGRyZW5fbnVtX3Bvc3R0ZXN0LCBjaGlsZHJlbl9vbGRlc3RfcG9zdHRlc3QsCiAgICAgICAgICAgIGNoaWxkcmVuX3lvdW5nZXN0X3Bvc3R0ZXN0LCBwbGFuX3BhcmVudF9wb3N0dGVzdCwKICAgICAgICAgICAgc3RhcnRzX3dpdGgoImZsdXNob3RfIiksIHN0YXJ0c193aXRoKCJ2YXhfIiksIHN0YXJ0c193aXRoKCJhdHRlbnRpb25fIiksCiAgICAgICAgICAgIHN0YXJ0c193aXRoKCJjb21tZW50cyIpLCBzdGFydHNfd2l0aCgiZHVyYXRpb24iKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJfcG9zdHRlc3QiLCAiIiwgLikpKSAlPiUKICBtdXRhdGUocGhhc2UgPSAicG9zdCIpCgpkIDwtIGJpbmRfcm93cyhkX3ByZSwgZF9wb3N0KSAlPiUgCiAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgLWMod29ya2VySWQsIHBoYXNlKSkgJT4lCiAgbXV0YXRlKHBoYXNlID0gZmFjdG9yKHBoYXNlLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcmUiLCAicG9zdCIpKSwKICAgICAgICAgcmV2ZXJzZV9jYXQgPSBpZmVsc2UoZ3JlcGwoIl9bMS05XXIkIiwgcXVlc3Rpb24pLCBUUlVFLCBGQUxTRSksCiAgICAgICAgICMgTk9URTogInJlc3BvbnNlIiBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2UgY29kZWQhCiAgICAgICAgIHF1ZXN0aW9uID0gZmFjdG9yKHF1ZXN0aW9uKSwKICAgICAgICAgc2NhbGUgPSBmYWN0b3IoZ3N1YigiXy4qJCIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInZhY2NJbnRlbnQiLCAidmFjY0RhbmdlciIsICJ2YWNjRWZmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhY2NTdHJhaW4iLCAidmFjY1RveCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNlYXNlU2V2ZXJlIiwgImRpc2Vhc2VSYXJlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZmFudEltbUxpbUNhcCIsICJpbmZhbnRJbW1XZWFrIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lZFNrZXB0IiwgImhiIiwgIm5hdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdmVycGFyIiwgInBhcmVudEV4cGVydCIpKSkgJT4lCiAgZnVsbF9qb2luKGRfZGVtbykgJT4lCiAgbXV0YXRlKGNvbmRpdGlvbiA9IGZhY3Rvcihjb25kaXRpb24sIGxldmVscyA9IGMoIm5vSW50ZXJ2IiwgImRpc2Vhc2VSaXNrIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSwgIWlzLm5hKHdvcmtlcklkKSwgIWlzLm5hKGNvbmRpdGlvbikpICU+JQogIGRpc3RpbmN0KCkKCiMgaG93IG1hbnkgbGVmdD8KZCAlPiUgZGlzdGluY3Qod29ya2VySWQsIGNvbmRpdGlvbikgJT4lIGNvdW50KGNvbmRpdGlvbikKYGBgCgpgYGB7ciBzY29yZXMsIGluY2x1ZGUgPSBGfQojIHNjb3JlIGFsbCBzY2FsZXMKZF9zY29yZWQgPC0gZCAlPiUKICBzZWxlY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgcGhhc2UsIHNjYWxlLCByZXNwb25zZSwKICAgICAgICAgZ2VuZGVyOmR1cmF0aW9uX3Bvc3R0ZXN0KSAlPiUKICBncm91cF9ieSh3b3JrZXJJZCwgY29uZGl0aW9uLCBwaGFzZSwgc2NhbGUpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMocmVzcG9uc2UpKSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocmVzcG9uc2UsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKIyBTY29yZSBkaXN0cmlidXRpb25zCgpGaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiBzY29yZXMgZm9yIGFsbCBzY2FsZXMsIHByZS0gYW5kIHBvc3QtdGVzdDoKCmBgYHtyIHNjb3JlcyBoaXN0bywgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDJ9CmdncGxvdChkX3Njb3JlZCwgCiAgICAgICBhZXMoeCA9IG1lYW4sIGZpbGwgPSBwaGFzZSkpICsKICAjIGZhY2V0X3dyYXAofiBzY2FsZSwgbmNvbCA9IDUpICsKICBmYWNldF9ncmlkKGNvbmRpdGlvbiB+IHNjYWxlKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE0LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMywgMywgMSkpICsgCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJkaXN0cmlidXRpb25zIG9mIHNjb3JlcyBieSBzY2FsZSwgY29uZGl0aW9uLCBhbmQgcGhhc2UgKHByZS9wb3N0KSIpCmBgYAoKYGBge3Igc2NvcmVzIGRlbnNpdHkgcGxvdCwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDIsIGluY2x1ZGUgPSBGfQojIGdncGxvdChkX3Njb3JlZCwgCiMgICAgICAgIGFlcyh4ID0gbWVhbiwgZmlsbCA9IHBoYXNlLCBjb2xvciA9IHBoYXNlKSkgKwojICAgIyBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSA1KSArCiMgICBmYWNldF9ncmlkKGNvbmRpdGlvbiB+IHNjYWxlKSArCiMgICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTMsIDMsIDEpKSArIAojICAgdGhlbWVfYncoKSArCiMgICBsYWJzKHRpdGxlID0gImRpc3RyaWJ1dGlvbnMgb2Ygc2NvcmVzIGJ5IHNjYWxlLCBjb25kaXRpb24sIGFuZCBwaGFzZSAocHJlL3Bvc3QpIikKYGBgCgpJdCBsb29rcyBsaWtlIHRoZXJlJ3MgYSBsb3Qgb2Ygb3ZlcmxhcCBpbiB0aGUgcHJlLSBhbmQgcG9zdC10ZXN0IGRpc3RydWJ0aW9ucyBmb3IgYWxsIHNjYWxlcyAtIHRob3VnaCBhIGZldyBoaW50cyBvZiBzdWJ0bGUgc2hpZnRzIChlLmcuLCBpbiBgZGlzZWFzZVJhcmVgLCBgdmFjY0ludGVudGApLgoKIyBWaXN1YWwgY29tcGFyaXNvbiBvZiBwcmUtIHZzLiBwb3N0LWludGVydmVudGlvbgoKTGV0J3MgY29tcGFyZSBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlcyBwcmUtIHZzLiBwb3N0LWludGVydmVudGlvbiBvbiBhbGwgc2NhbGVzLiBJJ2xsIHBsb3QgYm90aCBtZWFuIHByZS0gYW5kIHBvc3QtaW50ZXJ2ZW50aW9uIHNjb3JlcywgYXMgd2VsbCBhcyBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIChub3RlIHNlcGFyYXRlIGF4ZXMpOgoKYGBge3IgcGxvdCBtZWFucywgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDN9CmRfbWVhbnMgPC0gZF9zY29yZWQgJT4lCiAgZGlzdGluY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgcGhhc2UsIHNjYWxlLCBtZWFuKSAlPiUKICBncm91cF9ieShjb25kaXRpb24sIHBoYXNlLCBzY2FsZSkgJT4lCiAgIyBzdW1tYXJpc2UoTWVhbiA9IG1lYW4obWVhbiwgbmEucm0gPSBUKSwKICAjICAgICAgICAgICBMb3dlciA9IE1lYW4gLSAyICogc2QobWVhbiwgbmEucm0gPSBUKS9zcXJ0KG4oKSksCiAgIyAgICAgICAgICAgVXBwZXIgPSBNZWFuICsgMiAqIHNkKG1lYW4sIG5hLnJtID0gVCkvc3FydChuKCkpKSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRtZWFuKSkpKSAlPiUgIyBib290c3RyYXBwZWQgOTUlIENJCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKHNjYWxlID0gZmFjdG9yKHNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ2YWNjSW50ZW50IiwgInZhY2NEYW5nZXIiLCAidmFjY0VmZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWNjU3RyYWluIiwgInZhY2NUb3giLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzZWFzZVNldmVyZSIsICJkaXNlYXNlUmFyZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmZhbnRJbW1MaW1DYXAiLCAiaW5mYW50SW1tV2VhayIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWRTa2VwdCIsICJoYiIsICJuYXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcnBhciIsICJwYXJlbnRFeHBlcnQiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGZhY3Rvcihjb25kaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJkaXNlYXNlUmlzayIsICJhdXRpc21Db3JyIiwgIm5vSW50ZXJ2IikpKQoKZ19tZWFucyA8LSBnZ3Bsb3QoZF9tZWFucywKICAgICAgICAgICAgICAgICAgYWVzKHggPSBwaGFzZSwgeSA9IE1lYW4sCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbmRpdGlvbiwgZ3JvdXAgPSBjb25kaXRpb24pKSArCiAgZmFjZXRfd3JhcCh+IHNjYWxlLCBuY29sID0gMykgKwogIGdlb21fcGF0aChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIm1lYW4gc2NvcmUiLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0zLCAzKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh0aXRsZSA9ICJtZWFuIHNjb3JlcyBieSBwaGFzZSBhbmQgY29uZGl0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIikKCmdfbWVhbnMKYGBgCgpgYGB7ciBwbG90IGRpZmZzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KZF9kaWZmcyA8LSBkX3Njb3JlZCAlPiUKICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQogIG11dGF0ZShwb3N0X3ByZV9kaWZmID0gcG9zdCAtIHByZSkgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBzY2FsZSkgJT4lCiAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kcG9zdF9wcmVfZGlmZikpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcihzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidmFjY0ludGVudCIsICJ2YWNjRGFuZ2VyIiwgInZhY2NFZmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFjY1N0cmFpbiIsICJ2YWNjVG94IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2Vhc2VTZXZlcmUiLCAiZGlzZWFzZVJhcmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mYW50SW1tTGltQ2FwIiwgImluZmFudEltbVdlYWsiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkU2tlcHQiLCAiaGIiLCAibmF0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm92ZXJwYXIiLCAicGFyZW50RXhwZXJ0IikpLAogICAgICAgICBjb25kaXRpb24gPSBmYWN0b3IoY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZGlzZWFzZVJpc2siLCAiYXV0aXNtQ29yciIsICJub0ludGVydiIpKSkKCmdfZGlmZnMgPC0gZ2dwbG90KGRfZGlmZnMsCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLCB5ID0gTWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbmRpdGlvbiwgZ3JvdXAgPSBjb25kaXRpb24pKSArCiAgZmFjZXRfd3JhcCh+IHNjYWxlLCBuY29sID0gMykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIHNpemUgPSAwLjUpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX3lfY29udGludW91cygibWVhbiBkaWZmIikgKyAjLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0zLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICMgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHNjYWxlIGFuZCBjb25kaXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiKQoKZ19kaWZmcwpgYGAKCmBgYHtyIHBsb3QgbWVhbnMgYW5kIGRpZmZzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KbXVsdGlwbGljYW5kIDwtIDYKbXVsdGlfZnVuIDwtIGZ1bmN0aW9uKHgsIG11bHRpID0gbXVsdGlwbGljYW5kKXtyZXR1cm4oeCAqIG11bHRpKX0KZ19tZWFucyArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMi41LCB4ZW5kID0gMy41LCB5ID0gMCwgeWVuZCA9IDApLCAKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuMykgKwogIGdlb21fbGluZXJhbmdlKGRhdGEgPSBkX2RpZmZzICU+JSAKICAgICAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKE1lYW4sIExvd2VyLCBVcHBlciksIGZ1bnMobXVsdGlfZnVuKSkgJT4lCiAgICAgICAgICAgICAgICAgICBtdXRhdGUocGhhc2UgPSAiZGlmZiIpLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gcGhhc2UsIHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwKICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRfZGlmZnMgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKE1lYW4sIExvd2VyLCBVcHBlciksIGZ1bnMobXVsdGlfZnVuKSkgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShwaGFzZSA9ICJkaWZmIiksCiAgICAgICAgICAgICBhZXMoeCA9IHBoYXNlLCB5ID0gTWVhbiksCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIHNpemUgPSAyLCBzaGFwZSA9IDE3KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJwcmUiLCAicG9zdCIsICJkaWZmIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIm1lYW4gc2NvcmUiLCBicmVha3MgPSBzZXEoLTMsIDMsIDEpLAogICAgICAgICAgICAgICAgICAgICBzZWMuYXhpcyA9IHNlY19heGlzKH4uL211bHRpcGxpY2FuZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJtZWFuIGRpZmYiKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHRpdGxlID0gIm1lYW5zIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHNjYWxlIGFuZCBjb25kaXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXNcbk5PVEU6dXNlIGxlZnQgeS1heGlzIGZvciBwcmUgYW5kIHBvc3QgcGhhc2VzLCByaWdodCB5LWF4aXMgZm9yIGRpZmZlcmVuY2Ugc2NvcmVzIikKYGBgCgpTb21lIGludGVyZXN0aW5nIHRoaW5ncyBtaWdodCBiZSBnb2luZyBvbiBoZXJlISBQcm9iYWJseSBtb3N0IHVzZWZ1bCBwYWlyZWQgd2l0aCBzb21lIGFjdHVhbCBzdGF0cy4uLgoKIyBSZWdyZXNzaW9uIGFuYWx5c2VzCgpGaXJzdCwgbGV0J3MgY2hvb3NlIGhvdyB0byBjb2RlIG91ciBkYXRhIC0gSSd2ZSBzZXQgdXAgY29udHJhc3QgY29kaW5nLCBlZmZlY3QgY29kaW5nIGFuZCBkdW1teSBjb2Rpbmcgb3B0aW9ucyBoZXJlLCBhbmQgSSdsbCBnbyB3aXRoIGR1bW15LWNvZGluZyBmb3Igbm93ICh3aXRoIGBub0ludGVydmAgYW5kIGBwcmVgIGFzIHRoZSBiYXNlbGluZXMgZm9yIGNvbXBhcmlzb24gZm9yIGNvbmRpdGlvbiBhbmQgcGhhc2UsIHJlc3BlY3RpdmVseSkuCgpgYGB7ciBjb250cmFzdHMsIGluY2x1ZGUgPSBGfQojICMgb3J0aG9nb25hbCBjb250cmFzdCBjb2RpbmcKIyBjb250cmFzdHMoZF9zY29yZWQkY29uZGl0aW9uKSA8LSBjYmluZChpbnRlcnZfbm9uZSA9IGMoMSwgMSwgLTIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSX0FDID0gYygxLCAtMSwgMCkpCiMgY29udHJhc3RzKGRfc2NvcmVkJHBoYXNlKSA8LSBjYmluZChwb3N0X0dNID0gYygtMSwgMSkpCgojICMgZWZmZWN0IGNvZGluZwojIGNvbnRyYXN0cyhkX3Njb3JlZCRjb25kaXRpb24pIDwtIGNiaW5kKERSX0dNID0gYygxLCAwLCAtMSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfR00gPSBjKDAsIDEsIC0xKSkKIyBjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpIDwtIGNiaW5kKHBvc3RfR00gPSBjKC0xLCAxKSkKCiMgZHVtbXkgY29kaW5nCmNvbnRyYXN0cyhkX3Njb3JlZCRjb25kaXRpb24pIDwtIGNiaW5kKERSX25vbmUgPSBjKDAsIDEpKQpjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpIDwtIGNiaW5kKHBvc3RfcHJlID0gYygwLCAxKSkKYGBgCgpgYGB7ciBwcmludCBjb250cmFzdHN9CiMgcHJpbnQgb3V0IGNvbnRyYXN0cwpjb250cmFzdHMoZF9zY29yZWQkY29uZGl0aW9uKQpjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpCmBgYAoKIyMgQnkgc2NhbGUKClRoaXMgaXMgcmF0aGVyIGNyYXp5IChhbmQgb2YgY291cnNlIGV4cGxvcmF0b3J5KSBlbmRlYXZvciwgYW5kIHZlcnkgdnVsbmVyYWJsZSB0byBtdWx0aXBsZSBjb21wYXJpc29ucy4uLiBidXQgbGV0J3MgbG9vayBhdCB0aGUgZWZmZWN0cyBvbiBhbGwgc2NhbGVzIGluZGl2aWR1YWxseS4KCiMjIyBCZWxpZWZzIGFib3V0IHZhY2NpbmVzCgojIyMjIEludGVudGlvbnMgdG8gdmFjY2luYXRlIChgdmFjY0ludGVudGApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+KipOT1RFKio6IFRoaXMgaXMgb3VyIG1haW4gRFYgb2YgaW50ZXJlc3QuPC9zcGFuPgoKYGBge3IgcmVncmVzc2lvbiB2YWNjSW50ZW50fQojIHZhY2NJbnRlbnQKcjFfdmFjY0ludGVudCA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NJbnRlbnQiKSkKc3VtbWFyeShyMV92YWNjSW50ZW50KQpgYGAKClN1Y2Nlc3MhIEluIHRoZSBmb3JtIG9mIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiBwaGFzZSBhbmQgY29uZGl0aW9uICAoYHBoYXNlcG9zdF9wcmU6Y29uZGl0aW9uRFJfbm9uZWA6IGNoYW5nZSBmcm9tIHByZS0gdG8gcG9zdC1pbnRlcnZlbnRpb24gaW4gdGhlIERpc2Vhc2UgUmlzayB2cy4gTm8gSW50ZXJ2ZW50aW9uIGNvbmRpdGlvbnMpLgoKQW4gYW5hbHlzaXMgd2l0aCBjaGFuZ2Ugc2NvcmVzIChhIGxhIEhvcm5lLCBQb3dlbGwsIGV0IGFsLiAoMjAxNSwgKlBOQVMqKSk6CgpgYGB7ciByZWdyZXNzaW9uIGNoYW5nZSBzY29yZXMgdmFjY0ludGVudH0KIyB2YWNjSW50ZW50CnIyX3ZhY2NJbnRlbnQgPC0gbG0oZGlmZiB+IGNvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjYWxlID09ICJ2YWNjSW50ZW50IikgJT4lCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGRpZmYgPSBwb3N0IC0gcHJlKSkKc3VtbWFyeShyMl92YWNjSW50ZW50KQoKIyAjIGluIGNhc2UgeW91IHdhbnQgdG8gY2hlY2sgZXF1aXZhbGVuY2UgdG8gQU5PVkEKIyByM192YWNjSW50ZW50IDwtIG9uZXdheS50ZXN0KGRpZmYgfiBjb25kaXRpb24sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2FsZSA9PSAidmFjY0ludGVudCIpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZGlmZiA9IHBvc3QgLSBwcmUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLmVxdWFsID0gVFJVRSkKIyByM192YWNjSW50ZW50CmBgYAoKQWdhaW4sIHN1Y2Nlc3MhCgpIZXJlJ3MgdGhlIHJlbGV2YW50IHBsb3QgZnJvbSB0aGUgKlBOQVMqIHBhcGVyOgoKYGBge3IgcGxvdCBjaGFuZ2Ugc2NvcmVzIHZhY2NJbnRlbnQsIGZpZy53aWR0aCA9IDIsIGZpZy5oZWlnaHQgPSAyfQpnZ3Bsb3QoZF9kaWZmcyAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjSW50ZW50IiksCiAgICAgICBhZXMoeCA9IGNvbmRpdGlvbiwgeSA9IE1lYW4sIGZpbGwgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpLCB3aWR0aCA9IDAuMSkgKwogIHNjYWxlX3lfY29udGludW91cygidmFjY0ludGVudCBjaGFuZ2Ugc2NvcmUiLCBsaW1pdHMgPSBjKC0uMjUsIC41KSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIpCmBgYAoKIyMjIyBWYWNjaW5lIGRhbmdlciAoYHZhY2NEYW5nZXJgKQoKYGBge3IgcmVncmVzc2lvbiB2YWNjRGFuZ2VyfQojIHZhY2NEYW5nZXIKcjFfdmFjY0RhbmdlciA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NEYW5nZXIiKSkKc3VtbWFyeShyMV92YWNjRGFuZ2VyKQpgYGAKCiMjIyMgVmFjY2luZSBlZmZpY2FjeSAoYHZhY2NFZmZgKQoKYGBge3IgcmVncmVzc2lvbiB2YWNjRWZmfQojIHZhY2NFZmYKcjFfdmFjY0VmZiA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NFZmYiKSkKc3VtbWFyeShyMV92YWNjRWZmKQpgYGAKCiMjIyMgVmFjY2luZXMnIHRlbmRlbmN5IHRvIHN0cmFpbiB0aGUgaW5mYW50IGltbXVuZSBzeXN0ZW0gKGB2YWNjU3RyYWluYCkKCmBgYHtyIHJlZ3Jlc3Npb24gdmFjY1N0cmFpbn0KIyB2YWNjU3RyYWluCnIxX3ZhY2NTdHJhaW4gPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjU3RyYWluIikpCnN1bW1hcnkocjFfdmFjY1N0cmFpbikKYGBgCgojIyMjIFZhY2NpbmUgdG94aWNpdHkgKGB2YWNjVG94YCkKCmBgYHtyIHJlZ3Jlc3Npb24gdmFjY1RveH0KIyB2YWNjVG94CnIxX3ZhY2NUb3ggPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjVG94IikpCnN1bW1hcnkocjFfdmFjY1RveCkKYGBgCgojIyMgQmVsaWVmcyBhYm91dCBkaXNlYXNlcwoKIyMjIyBEaXNlYXNlIHNldmVyaXR5IChgZGlzZWFzZVNldmVyZWApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+KipOT1RFKio6IFRoaXMgaXMgdGhlIHNjYWxlIHRoYXQgd2UgdGhvdWdodCB0aGUgRGlzZWFzZSBSaXNrIGludGVydmVudGlvbiBzaG91bGQgYWZmZWN0IG1vc3QgZGlyZWN0bHkuPC9zcGFuPgoKYGBge3IgcmVncmVzc2lvbiBkaXNlYXNlU2V2ZXJlfQojIGRpc2Vhc2VTZXZlcmUKcjFfZGlzZWFzZVNldmVyZSA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImRpc2Vhc2VTZXZlcmUiKSkKc3VtbWFyeShyMV9kaXNlYXNlU2V2ZXJlKQpgYGAKCiMjIyMgRGlzZWFzZSByYXJpdHkgKGBkaXNlYXNlUmFyZWApCgpgYGB7ciByZWdyZXNzaW9uIGRpc2Vhc2VSYXJlfQojIGRpc2Vhc2VSYXJlCnIxX2Rpc2Vhc2VSYXJlIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImRpc2Vhc2VSYXJlIikpCnN1bW1hcnkocjFfZGlzZWFzZVJhcmUpCmBgYAoKIyMjIEJlbGllZnMgYWJvdXQgaW5mYW50cycgaW1tdW5lIHN5c3RlbXMKCiMjIyMgTGltaXRlZCBjYXBhY2l0eSBvZiBpbmZhbnRzJyBpbW11bmUgc3lzdGVtcyAoYGluZmFudEltbUxpbUNhcGApCgpgYGB7ciByZWdyZXNzaW9uIGluZmFudEltbUxpbUNhcH0KIyBpbmZhbnRJbW1MaW1DYXAKcjFfaW5mYW50SW1tTGltQ2FwIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJpbmZhbnRJbW1MaW1DYXAiKSkKc3VtbWFyeShyMV9pbmZhbnRJbW1MaW1DYXApCmBgYAoKIyMjIyBXZWFrbmVzcyBvZiBpbmZhbnRzJyBpbW11bmUgc3lzdGVtcyAoYGluZmFudEltbVdlYWtgKQoKYGBge3IgcmVncmVzc2lvbiBpbmZhbnRJbW1XZWFrfQojIGluZmFudEltbVdlYWsKcjFfaW5mYW50SW1tV2VhayA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImluZmFudEltbVdlYWsiKSkKc3VtbWFyeShyMV9pbmZhbnRJbW1XZWFrKQpgYGAKCiMjIyBPdGhlciBiZWxpZWZzLCBhdHRpdHVkZXMsIGFuZCB3b3JsZHZpZXdzCgojIyMjIE1lZGljYWwgc2tlcHRpY2lzbSAoYG1lZFNrZXB0YCkKCmBgYHtyIHJlZ3Jlc3Npb24gbWVkU2tlcHR9CiMgbWVkU2tlcHQKcjFfbWVkU2tlcHQgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lIGZpbHRlcihzY2FsZSA9PSAibWVkU2tlcHQiKSkKc3VtbWFyeShyMV9tZWRTa2VwdCkKYGBgCgojIyMjIEhvbGlzdGljIGJhbGFuY2UgKGBoYmApCgpgYGB7ciByZWdyZXNzaW9uIGhifQojIGhiCnIxX2hiIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImhiIikpCnN1bW1hcnkocjFfaGIpCmBgYAoKIyMjIyBOYXR1cmFsaXNtIChgbmF0YCkKCmBgYHtyIHJlZ3Jlc3Npb24gbmF0fQojIG5hdApyMV9uYXQgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gIm5hdCIpKQpzdW1tYXJ5KHIxX25hdCkKYGBgCgojIyMjIE92ZXJwYXJlbnRpbmcgKGBvdmVycGFyYCkKCmBgYHtyIHJlZ3Jlc3Npb24gb3ZlcnBhcn0KIyBvdmVycGFyCnIxX292ZXJwYXIgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJvdmVycGFyIikpCnN1bW1hcnkocjFfb3ZlcnBhcikKYGBgCgojIyMjIFBhcmVudGFsIEV4cGVydGlzZSAoYHBhcmVudEV4cGVydGApCgpgYGB7ciByZWdyZXNzaW9uIHBhcmVudEV4cGVydH0KIyBwYXJlbnRFeHBlcnQKcjFfcGFyZW50RXhwZXJ0IDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJwYXJlbnRFeHBlcnQiKSkKc3VtbWFyeShyMV9wYXJlbnRFeHBlcnQpCmBgYAoKIyBPdGhlciBzdHVmZgoKIyMgVmlvbGluIHBsb3RzCgpXaXRoIHZpb2xpbiBwbG90cywgd2UgY2FuIHNlZSB0aGUgZnVsbCBkaXN0cmlidXRpb24gb2Ygc2NvcmVzIGF0IGVhY2ggdGltZSBwb2ludCBpbiBlYWNoIGNvbmRpdGlvbjoKCmBgYHtyIHBsb3QgdmlvbGluLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gNX0KZ2dwbG90KGRfc2NvcmVkLAogICAgICAgYWVzKHggPSBpbnRlcmFjdGlvbihwaGFzZSwgY29uZGl0aW9uKSwgeSA9IG1lYW4sICMgZmlsbCA9IGNvbmRpdGlvbiwgCiAgICAgICAgICAgZ3JvdXAgPSBpbnRlcmFjdGlvbihwaGFzZSwgY29uZGl0aW9uKSkpICsKICBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSAzKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb25kaXRpb24pLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjMsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgIyBnZW9tX2JveHBsb3QoYWxwaGEgPSAwKSArCiAgZ2VvbV92aW9saW4oYWxwaGEgPSAwLAogICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gYygwLjI1LCAwLjUsIDAuNzUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJtZWFuIHNjb3JlIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTMsIDMpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUoInBoYXNlIGJ5IGNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSByZXAoYygicHJlIiwgInBvc3QiKSwgMykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKyAjLAogICAgICAgICMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKICBsYWJzKHRpdGxlID0gInZpb2xpbiBwbG90IG9mIHByZS0gYW5kIHBvc3QtaW50ZXJ2ZW50aW9uIHNjb3JlcyBieSBzY2FsZSBhbmQgY29uZGl0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImhvcml6b250YWwgbGluZXMgY29ycmVzcG9uZCB0byAyNXRoLCA1MHRoLCBhbmQgNzV0aCBwZXJjZW50aWxlcyIpCmBgYAoKIyBEZXJlaydzIGFuYWx5c2VzCgpfREFURV86IE1hcmNoIDEzLCAyMDE4IDM6NTIgUE0KCkknbSBnb2luZyB0byBwaWNrIHVwIGhlcmUgYW5kIGRvIHNvbWUgZnVydGhlciByZWdyZXNzaW9uIGFuYWx5c2VzLiBJJ2xsIGxvb2sgYXQgdGhpcyBkYXRhIGluIHRoZSB3YXkgSSAqd2lzaCogd2UnZCBsb29rZWQgYXQgdGhlIG9yaWdpbmFsIFBOQVMgZGF0YS4KClRoYXQgaXMsICgxKSB1c2luZyBhbiBvcmRpbmFsIEhMTSByZWdyZXNzaW9uIG92ZXIgdGhlIGZpdmUgc2VwYXJhdGUgc2NhbGUgaXRlbXMgKGNvbmNlcHR1YWxseSwgSSB0aGluaywgc2ltaWxhciB0byBTRU0tc3R5bGUgYXBwcm9hY2hlcyksIGFuZCAoMikgdXNpbmcgYmV0YSByZWdyZXNzaW9uLgoKVGhlcmUgYXJlIHR3byBnZW5lcmFsIG1vZGVsIGZvcm1zIHRoYXQgSSB0aGluayBhcmUgcmVhc29uYWJsZSBmb3IgbG9va2luZyBhdCB0aGlzLiBGaXJzdDoKCmBgYApyZXNwb25zZSB+IHBoYXNlICogY29uZGl0aW9uCmBgYAoKS2FyYSBhbHJlYWR5IHRyaWVkIHRoaXMgZ2VuZXJhbCBhcHByb2FjaCwgc2F2aW5nIHRoZSBtb2RlbCBhcyBgcjFfdmFjY0ludGVudGAuIFNvIHRoZSBvbmx5IGRpZmZlcmVuY2UgaGVyZSB3aWxsIGJlIHRoZSBkaXN0cmlidXRpb25zIEkgdXNlLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIHJlcXVpcmVkLCBhbmQgdGhlIHJlYWwgdGhpbmcgdG8gdGVzdCBpcyB0aGUgcGhhc2UqY29uZGl0aW9uIGludGVyYWN0aW9uLiAKCkFuZCBzZWNvbmQ6CgpgYGAKcG9zdF9yZXNwb25zZSB+IHByZV9yZXNwb25zZSAqIGNvbmRpdGlvbgpgYGAKCkhlcmUgcHJlX3Jlc3BvbnNlIGNvdWxkIGJlIHRoZSByZXNwb25zZSBvbiB0aGUgb3ZlcmFsbCBwcmUtdGVzdCBzY2FsZSwgb3IgdGhlIGluZGl2aWR1YWwgaXRlbXMuIEluIGFkZGl0aW9uLCB0aGUgaW50ZXJhY3Rpb24gdGVybXMgYXJlIG9wdGlvbmFsLCBhcyB3YXJyYW50ZWQgYnkgdGhlIGRhdGEuIEknZCB3YWdlciB0aGlzIGlzIHRoZSBtb3JlIGZhbWlsaWFyIGFwcHJvYWNoIGZvciBtb3N0IHBzeWNob2xvZ2lzdHMuCgojIyBPcmRpbmFsIEhMTQoKIyMjIFByZWRpY3RpbmcgInJlc3BvbnNlIgoKYGBge3J9CgojIGxpYnJhcnkoYnJtcykKIyBmaXQub3JkIDwtIGJybShyZXNwb25zZSB+IGNvbmRpdGlvbiAqIHBoYXNlICsgKDF8d29ya2VySWQpICsgKDF8cXVlc3Rpb24pLCAKIyAgICAgICAgICAgICAgICBkYXRhPWQgJT4lCiMgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NhbGU9PSJ2YWNjSW50ZW50IikgJT4lCiMgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoY29uZGl0aW9uID0gcmVsZXZlbChjb25kaXRpb24sIHJlZj0ibm9JbnRlcnYiKSksCiMgICAgICAgICAgICAgICAgZmFtaWx5PWN1bXVsYXRpdmUoKSwKIyAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IC44NSksCiMgICAgICAgICAgICAgICAgY29yZXMgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSwKIyAgICAgICAgICAgICAgICBpdGVyID0gMjAwMCkKIyBzdW1tYXJ5KGZpdC5vcmQpCmBgYAoKIyMjIFByZWRpY3RpbmcgcG9zdC10ZXN0CgpIZXJlIGBwcmVgIGlzIHRoZSBzcGVjaWZpYyBpdGVtIHByZS10ZXN0IHNjb3JlIGFuZCBgcHJlTWVhbmAgaXMgdGhlIG1lYW4gb2YgdGhlIHNjYWxlIGF0IHByZXRlc3QuCgpgYGB7cn0KIyBkMSA8LSBkICU+JQojICAgZmlsdGVyKHNjYWxlPT0idmFjY0ludGVudCIpICU+JQojICAgbXV0YXRlKGNvbmRpdGlvbiA9IHJlbGV2ZWwoY29uZGl0aW9uLCByZWY9Im5vSW50ZXJ2IikpICU+JSAKIyAgIHNwcmVhZChwaGFzZSxyZXNwb25zZSkgJT4lCiMgICBzZWxlY3QocHJlLCBwb3N0LCBjb25kaXRpb24sIHdvcmtlcklkLCBxdWVzdGlvbikgJT4lCiMgICB7CiMgICAgIHsuIC0+IHRtcH0gJT4lIAojICAgICAgIGdyb3VwX2J5KHdvcmtlcklkKSAlPiUKIyAgICAgICBzdW1tYXJpemUocHJlTWVhbj1tZWFuKHByZSkpICU+JQojICAgICAgIGxlZnRfam9pbih0bXAsIGJ5PSJ3b3JrZXJJZCIpCiMgICB9CmBgYAoKCmBgYHtyfQojIGZpdC5vcmQyIDwtIGJybShwb3N0IH4gY29uZGl0aW9uICsgcHJlTWVhbiArICgxfHdvcmtlcklkKSArICgxfHF1ZXN0aW9uKSwgCiMgICAgICAgICAgICAgICAgZGF0YT1kMSwKIyAgICAgICAgICAgICAgICBmYW1pbHk9Y3VtdWxhdGl2ZSgpLAojICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gLjg1KSwKIyAgICAgICAgICAgICAgICBjb3JlcyA9IHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpLAojICAgICAgICAgICAgICAgIGl0ZXIgPSAyMDAwKQojIHN1bW1hcnkoZml0Lm9yZDIpCmBgYAoKCiMjIFJlZ3Jlc3Npb24gb24gc2NhbGUgYXZlcmFnZXMKClJlY2FsbCwgS2FyYSBhbHJlYWR5IGxvb2tlZCBhdCBhIG5vcm1hbCByZWdyZXNzaW9uIG9uIHJlc3BvbnNlcyB3aXRoIGByMV92YWNjSW50ZW50YCBtb2RlbC4KCiMjIyBOb3JtYWwgcmVncmVzc2lvbjogcHJlZGljdGluZyBwb3N0LXRlc3QKCmBgYHtyfQpkMiA8LSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlPT0idmFjY0ludGVudCIpICU+JSBzcHJlYWQocGhhc2UsbWVhbikgJT4lIG11dGF0ZShjb25kaXRpb24gPSByZWxldmVsKGNvbmRpdGlvbiwgcmVmPSJub0ludGVydiIpKQoKY29udHJhc3RzKGQyJGNvbmRpdGlvbikgPC0gY2JpbmQoZGlzZWFzZVJpc2sgPSBjKDAsIDEpKQoKZml0LmxtIDwtIGxtKHBvc3QgfiBzY2FsZShwcmUpICogY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICAgIGRhdGE9ZDIpCnN1bW1hcnkoZml0LmxtKQpgYGAKCiMjIyBCZXRhIHJlZ3Jlc3Npb246IHJlc3BvbnNlCgpBIGJldGEgcmVncmVzc2lvbiBvbiB0aGUgcmVzcG9uc2VzIGFjY29yZHMgd2l0aCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gb24gcmVzcG9uc2VzLS1zbGlnaHQgcG9zaXRpdmUgZWZmZWN0IG9mIGRpc2Vhc2VSaXNrLCBzbGlnaHQgbmVnYXRpdmUgZWZmZWN0IG9mIGF1dGlzbSBjb3JyZWN0aW9uLCBidXQgdG9vIG11Y2ggdW5jZXJ0YWludHkgb3ZlcmFsbC4KCkJ1dCwgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGlzbid0IHJlYWxseSBhbGwgdGhhdCBhcHByb3ByaWF0ZSBmb3IgYSBsaW5lYXIgcmVncmVzc2lvbiwgZXZlbiBpZiBtYW55IHJlc2VhcmNoZXJzIHdvdWxkIGJlIGhhcHB5IHdpdGggdGhhdCByZXN1bHRzIGFuZCBtb3ZlIG9uLiBJbnN0ZWFkLCB2YWNjSW50ZW50IGlzIGJvdW5kZWQgYW5kIGhpZ2hseSBza2V3ZWQuIFRoYXQgbWFrZXMgaXQgc3VpdGFibGUgZm9yIGJldGEgcmVncmVzc2lvbi4KCmBgYHtyfQpyZXNjYWxlX2JldGEgPC0gZnVuY3Rpb24oeCwgbG93ZXIsIHVwcGVyKSB7CiAgIyByZXNjYWxlcyBvbnRvIHRoZSBvcGVuIGludGVydmFsICgwLDEpCiAgIyByZXNjYWxlcyBvdmVyIHRoZW9yZXRpY2FsIGJvdW5kcyBvZiBtZWFzdXJlbWVudCwgc3BlY2lmaWVkIGJ5ICJ1cHBlciIgYW5kICJsb3dlciIKICAjIGJhc2VkIG9uIFNtaXRoc29uICYgVmVya3VpbGVuICgyMDA2KSwgdGhvdWdoIHRoaXMgaXMgbm90IGFzIHByaW5jaXBsZWQgYXMgeW91IG1pZ2h0IHRoaW5rCiAgIyBzZWUgaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAzNy8xMDgyLTk4OVguMTEuMS41NC5zdXBwCgogIE4gPC0gbGVuZ3RoKHgpCiAgcmVzIDwtICh4LWxvd2VyKS8odXBwZXIgLSBsb3dlcikKICByZXMgPC0gKHJlcyooTi0xKSArIC41KS9OCgogIHJldHVybihhcy52ZWN0b3IocmVzKSkKfQojIAojIGZpdC5iZXRhUjwtIGJybShtZWFuIH4gY29uZGl0aW9uICogcGhhc2UgKyAoMXx3b3JrZXJJZCksIAojICAgICAgICAgICAgICAgIGRhdGE9ZF9zY29yZWQgJT4lIG11dGF0ZShtZWFuID0gcmVzY2FsZV9iZXRhKG1lYW4sLTMsMykpLAojICAgICAgICAgICAgICAgIGZhbWlseT1CZXRhKCksCiMgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAuODUpLAojICAgICAgICAgICAgICAgIGNvcmVzID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCksCiMgICAgICAgICAgICAgICAgaXRlciA9IDIwMDApCiMgCiMgc3VtbWFyeShmaXQuYmV0YVIpCmBgYAoKIyMjIEJldGEgcmVncmVzc3Rpb246IHBvc3R0ZXN0CgpMZXQncyBsb29rIGF0IHByZWRpY3RpbmcgcG9zdC10ZXN0IHdpdGggYmV0YSByZWdyZXNzaW9uLiBIZXJlIHRoZXJlJ3Mgbm8gZXZpZGVuY2UgYXQgYWxsIGZvciBhbnkgcG9zaXRpdmUgZWZmZWN0IG9mIGRpc2Vhc2VSaXNrIChpbiBmYWN0IHRoZSBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSksIGJ1dCB0aGVyZSBpcyBldmlkZW5jZSBvZiAqKkJBQ0tGSVJFKiogZm9yIHRoZSBhdXRpc20gY29ycmVjdGlvbiBjb25kaXRpb24uCgpgYGB7cn0KbGlicmFyeShiZXRhcmVnKQoKY29udHJhc3RzKGQyJGNvbmRpdGlvbikgPC0gY2JpbmQoZGlzZWFzZVJpc2sgPSBjKDAsIDEpKQoKZml0LmJldGFJbnQgPC0gYmV0YXJlZyhwb3N0IH4gc2NhbGUocHJlKSAqIGNvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkYXRhPWQyICU+JSBtdXRhdGUocG9zdD1yZXNjYWxlX2JldGEocG9zdCwtMywzKSkpCgpzdW1tYXJ5KGZpdC5iZXRhSW50KQpgYGAKCkFJQyBmYXZvcnMgdGhlIGJldGEgcmVncmVzc2lvbiBvdmVyIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBzdHJvbmdseS4KCmBgYHtyfQpBSUMobG0ocG9zdCB+IHByZSAqIGNvbmRpdGlvbiwgZGF0YT1kMiAlPiUgbXV0YXRlKHBvc3Q9cmVzY2FsZV9iZXRhKHBvc3QsLTMsMykpKSkKQUlDKGZpdC5iZXRhSW50KQpgYGAKCmBgYHtyfQoKZml0Lm9sc1NjYWxlZCA8LSBsbShwb3N0IH4gc2NhbGUocHJlKSAqIGNvbmRpdGlvbiwgZGF0YT1kMiAlPiUgbXV0YXRlKHBvc3Q9cmVzY2FsZV9iZXRhKHBvc3QsLTMsMykpKQoKZDIgJT4lIAogIG11dGF0ZShwb3N0PXJlc2NhbGVfYmV0YShwb3N0LC0zLDMpKSAlPiUKICBzZWxlY3QoY29uZGl0aW9uLCBwcmUsIHBvc3QpICU+JQogIGJpbmRfY29scyhwcmVkaWN0KGZpdC5iZXRhSW50KSAlPiUgYXNfdGliYmxlKCkpICU+JQogIHJlbmFtZShwcmVkaWN0aW9uQmV0YT12YWx1ZSkgJT4lCiAgYmluZF9jb2xzKHByZWRpY3QoZml0Lm9sc1NjYWxlZCkgJT4lIGFzX3RpYmJsZSgpKSAlPiUKICByZW5hbWUocHJlZGljdGlvbk9MUz12YWx1ZSkgJT4lCgpnZ3Bsb3QoYWVzKHggPSBwcmUsIHkgPSBwb3N0LCBjb2xvcj1jb25kaXRpb24pKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0PS4xLCB3aWR0aD0uMDUsIGFscGhhPS44LCBzaGFwZT0xKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZGljdGlvbkJldGEsIGxpbmV0eXBlPSJCZXRhIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkaWN0aW9uT0xTLCBsaW5ldHlwZT0iT0xTIikpICsKICAjIGdlb21fbGluZShhZXMoeSA9IHByZWRpY3QoZml0Lm9scywgdmFjY1cpLAogICMgICAgICAgICAgICAgICBjb2xvdXIgPSAiT0xTIiwgbGluZXR5cGUgPSAiT0xTIikpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwoIiIsIHZhbHVlcyA9IGMoInJlZCIsICJibHVlIikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwoIiIsIHZhbHVlcyA9IGMoInNvbGlkIiwgImRhc2hlZCIpKSArCiAgdGhlbWVfYncoKQpgYGAKCg==